package com.codeplatform.entity;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;

import com.baomidou.mybatisplus.annotation.*;
import java.time.LocalDateTime;

/**
 * 用户会话实体类
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("user_sessions")
public class UserSession {
    
    /**
     * 会话ID
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    
    /**
     * 用户ID
     */
    @TableField("user_id")
    private Long userId;
    
    /**
     * 会话令牌
     */
    @TableField("session_token")
    private String sessionToken;
    
    /**
     * 刷新令牌
     */
    @TableField("refresh_token")
    private String refreshToken;
    
    /**
     * 设备信息
     */
    @TableField("device_info")
    private String deviceInfo;
    
    /**
     * IP地址
     */
    @TableField("ip_address")
    private String ipAddress;
    
    /**
     * 用户代理
     */
    @TableField("user_agent")
    private String userAgent;
    
    /**
     * 是否活跃
     */
    @TableField("is_active")
    private Boolean isActive = true;
    
    /**
     * 过期时间
     */
    @TableField("expires_at")
    private LocalDateTime expiresAt;
    
    /**
     * 刷新令牌过期时间
     */
    @TableField("refresh_expires_at")
    private LocalDateTime refreshExpiresAt;
    
    /**
     * 最后活跃时间
     */
    @TableField("last_active_at")
    private LocalDateTime lastActiveAt;
    
    /**
     * 创建时间
     */
    @TableField(value = "created_at", fill = FieldFill.INSERT)
    private LocalDateTime createdAt;
    
    /**
     * 更新时间
     */
    @TableField(value = "updated_at", fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updatedAt;
    

    
    /**
     * 检查会话是否过期
     */
    public boolean isExpired() {
        return LocalDateTime.now().isAfter(expiresAt);
    }
    
    /**
     * 检查刷新令牌是否过期
     */
    public boolean isRefreshExpired() {
        return LocalDateTime.now().isAfter(refreshExpiresAt);
    }
    
    /**
     * 检查会话是否有效
     */
    public boolean isValid() {
        return isActive && !isExpired();
    }
    
    /**
     * 更新最后活跃时间
     */
    public void updateLastActive() {
        this.lastActiveAt = LocalDateTime.now();
        this.updatedAt = LocalDateTime.now();
    }
}